6
Most read
8
Most read
13
Most read
# 
Erik van Nooijen 
Technical Lead at TomTom
# 
10 years as contractor 
• (senior) developer 
5 years in TomTom - Netherlands 
• 3 years senior developer 
• 2 years technical lead
#
# 
TomTom total Perforce installation 
size 780 Gb database 
3.2 TB versioned files 
#proxies 10 
#replicas 4 
#users ~700 
#workspaces ~19000 
#changes ~1.000.000 
Main server 32 core 
284 Gb ram 
4* Fusion IO (ssd) 
8.6 Tb 
Streamed depot 
size 52 Gb 
#streams 360 
#mainlines 1 
#release streams 20 
#users ~150 
#changes ~80000
#
# 
• Parent / child stream relationship 
– predefined integration flows 
• Merge-down / copy-up 
– resolve-on-child paradigm 
• Stream specification vs branch mapping 
• Moving workspace 
• Naming conventions 
– Renaming a stream does not rename the underlying branch 
• Deleting streams
#
# 
• Integrate 1 (or few) specific changelists 
up, without doing a full copy-up 
• Examples: 
– Quick propagation of a bug fix 
– Selective moving finished work to prep stream
#
# 
• Integrations that are not following pre-defined flow 
• Using ‘p4 integrate //source/…@11,11 //dest/…’ 
• Example: integrate specific changelist into existing 
release. Most often happens for bug fixes.
# 
• Integrations that are not following pre-defined flow 
• Using ‘p4 integrate //source/…@11,11 //dest/…’ 
• Example: integrate specific changelist across 
development streams, without going via main. 
Usually for inter-dependencies between 
developments. 
• Alternative; use stream specification with ‘import’ 
– Defined imports with ‘import @’ available with p4d 
2014.1 
– Writable imports become available with p4d 2014.2
#
# 
Stream: //depot/main 
Type: mainline 
Paths: share //… 
Stream: //depot/dev-X 
Type: development 
Parent: //depot/main 
Paths: share //… 
import versions.txt //depot/main/versions.txt 
Client: depot_dev_ws 
View: //depot/dev-X/… // depot_dev_ws/… 
!! No ‘Stream:’ but using branch mappings 
$ p4 edit versions.txt 
$ p4 submit –d “my own development identifiers in versions.txt” 
$ p4 copy //depot/dev-X/… //depot/main/… 
$ p4 submit -d “copy up from dev stream” 
!! No –S <stream> for copy argument, but branch mappings 
Result: versions.txt changed on main! 
Final solution: 
1. RW permission group on main for this file 
2. educating users on p4 copy
#
# 
• Most benefit on server side, less so for end-users 
• Can be confusing when used with branch mapping 
• When to use regular development stream vs task stream ? 
– Task streams can be converted to type development, but conversion back is not possible 
• We decided not to use them, instead we use development streams only
# 
• Reduce the amount of data that gets pulled into a workspace 
• Compose product combinations with only imports 
– One mainline with all imports for ‘mainlines’ 
– Many virtual streams based on the mainline that overrule the imports with various ‘release’ 
imports 
– Easy and cheap to make many combinations
# 
canary-main (type: mainline) 
import os/… //depot-os/main/… 
import engine/… //depot-engine/main/… 
import ui/… //depot-ui/main/… 
import engine/ui-tweaks/… //depot-ui/main/tweaks/… 
canary-ui-rel1 (type: virtual) 
share … 
import ui/… //depot-ui/rel-1/… 
import engine/ui-tweaks/… //depot-ui/rel-1/tweaks/… 
canary-ui-rel2 (type: virtual) 
share … 
import ui/… //depot-engine/rel-2/… 
import engine/ui-tweaks/… //depot-ui/rel-2/tweaks/…
#
# 
• ‘p4 integrate –f’ is evil ! 
– alternative is ‘p4 copy’ 
• Use ‘integ.engine = 3’ 
– engine 3 is default, but maybe you have engine 2 specifically configured 
• Import with stream specification not (yet) supported 
– ‘import //… -S //depot/stream’
# 
• Educate your user base 
• Cherry picking integrations 
• Cross integrations 
• Stream specification versus branch mapping 
• Task and virtual streams
# 
Erik van Nooijen 
eric.vannooijen@tomtom.com 
#idonttweet

More Related Content

PDF
[Ubisoft] Perforce Integration in a AAA Game Engine
PDF
Best Practices For Game Development Using Perforce Streams
PDF
PostgreSQL Replication with Bucardo
PDF
Iceberg: A modern table format for big data (Strata NY 2018)
PPTX
Apache Arrow: In Theory, In Practice
PDF
[KubeCon EU 2022] Running containerd and k3s on macOS
PDF
Spark SQL Join Improvement at Facebook
PPTX
GitOps w/argocd
[Ubisoft] Perforce Integration in a AAA Game Engine
Best Practices For Game Development Using Perforce Streams
PostgreSQL Replication with Bucardo
Iceberg: A modern table format for big data (Strata NY 2018)
Apache Arrow: In Theory, In Practice
[KubeCon EU 2022] Running containerd and k3s on macOS
Spark SQL Join Improvement at Facebook
GitOps w/argocd

What's hot (20)

PDF
When Kafka Meets the Scaling and Reliability needs of World's Largest Retaile...
PDF
MinIO January 2020 Briefing
PPTX
A Deep Dive into Spark SQL's Catalyst Optimizer with Yin Huai
PDF
Bucketing 2.0: Improve Spark SQL Performance by Removing Shuffle
PDF
Inside Parquet Format
PDF
Debugging node in prod
PDF
Parquet Strata/Hadoop World, New York 2013
PPTX
Spark Shuffle Deep Dive (Explained In Depth) - How Shuffle Works in Spark
PDF
The Apache Spark File Format Ecosystem
PPTX
Azure Data Explorer deep dive - review 04.2020
PDF
Efficient Data Storage for Analytics with Parquet 2.0 - Hadoop Summit 2014
PPTX
Minio Cloud Storage
PDF
The Parquet Format and Performance Optimization Opportunities
PDF
Solving Enterprise Data Challenges with Apache Arrow
PDF
Parquet performance tuning: the missing guide
PDF
Tiered Compilation in Hotspot JVM
PDF
Efficient Data Storage for Analytics with Apache Parquet 2.0
PDF
Apache Spark Streaming in K8s with ArgoCD & Spark Operator
PDF
Accelerating Apache Spark Shuffle for Data Analytics on the Cloud with Remote...
PDF
Predicting Flights with Azure Databricks
When Kafka Meets the Scaling and Reliability needs of World's Largest Retaile...
MinIO January 2020 Briefing
A Deep Dive into Spark SQL's Catalyst Optimizer with Yin Huai
Bucketing 2.0: Improve Spark SQL Performance by Removing Shuffle
Inside Parquet Format
Debugging node in prod
Parquet Strata/Hadoop World, New York 2013
Spark Shuffle Deep Dive (Explained In Depth) - How Shuffle Works in Spark
The Apache Spark File Format Ecosystem
Azure Data Explorer deep dive - review 04.2020
Efficient Data Storage for Analytics with Parquet 2.0 - Hadoop Summit 2014
Minio Cloud Storage
The Parquet Format and Performance Optimization Opportunities
Solving Enterprise Data Challenges with Apache Arrow
Parquet performance tuning: the missing guide
Tiered Compilation in Hotspot JVM
Efficient Data Storage for Analytics with Apache Parquet 2.0
Apache Spark Streaming in K8s with ArgoCD & Spark Operator
Accelerating Apache Spark Shuffle for Data Analytics on the Cloud with Remote...
Predicting Flights with Azure Databricks
Ad

Similar to Five Real-World Strategies for Perforce Streams (19)

PDF
Streams in Parallel Development by Sven Erik Knop
PPTX
Moving 1,000 Users & 100 Branches into Streams
PDF
Perforce Unplugged: Central and Distributed Versioning and distributed versio...
PPTX
Driving Innovation with Component-based Development at Boeing
PDF
2013 Perforce Collaboration Tour - MathWorks
PDF
Perforce Streams
PDF
White Paper: Compartmentalized Continuous Integration: Enabling Rapid, Flexib...
PDF
Git and Git Workflow Models as Catalysts of Software Development
PDF
Using OSGi R4 Service Platform in Vehicle Embedded Systems - Miguel Lopez, So...
PDF
Compartmentalized Continuous Integration: Enabling Rapid, Flexible Collaborat...
PPTX
How to Reduce Database Load with Sparse Branches
PDF
Git with t for teams
PPTX
Gears of Perforce: AAA Game Development Challenges
PDF
[Tel aviv merge world tour] Perforce Server Update
PDF
[Paris merge world tour] Perforce Server Update
PPTX
Picnic Software - Developing a flexible and scalable application
PDF
Extending Perforce Scalability Using Job Content Synchronization
PPTX
Transferring Changes Between Perforce Servers
PDF
Architecture OutSystems Security Specialization - Study Help Deck
Streams in Parallel Development by Sven Erik Knop
Moving 1,000 Users & 100 Branches into Streams
Perforce Unplugged: Central and Distributed Versioning and distributed versio...
Driving Innovation with Component-based Development at Boeing
2013 Perforce Collaboration Tour - MathWorks
Perforce Streams
White Paper: Compartmentalized Continuous Integration: Enabling Rapid, Flexib...
Git and Git Workflow Models as Catalysts of Software Development
Using OSGi R4 Service Platform in Vehicle Embedded Systems - Miguel Lopez, So...
Compartmentalized Continuous Integration: Enabling Rapid, Flexible Collaborat...
How to Reduce Database Load with Sparse Branches
Git with t for teams
Gears of Perforce: AAA Game Development Challenges
[Tel aviv merge world tour] Perforce Server Update
[Paris merge world tour] Perforce Server Update
Picnic Software - Developing a flexible and scalable application
Extending Perforce Scalability Using Job Content Synchronization
Transferring Changes Between Perforce Servers
Architecture OutSystems Security Specialization - Study Help Deck
Ad

More from Perforce (20)

PDF
How to Organize Game Developers With Different Planning Needs
PDF
Regulatory Traceability: How to Maintain Compliance, Quality, and Cost Effic...
PDF
Efficient Security Development and Testing Using Dynamic and Static Code Anal...
PDF
Understanding Compliant Workflow Enforcement SOPs
PDF
Branching Out: How To Automate Your Development Process
PDF
How to Do Code Reviews at Massive Scale For DevOps
PDF
How to Spark Joy In Your Product Backlog
PDF
Going Remote: Build Up Your Game Dev Team
PDF
Shift to Remote: How to Manage Your New Workflow
PPTX
Hybrid Development Methodology in a Regulated World
PPTX
Better, Faster, Easier: How to Make Git Really Work in the Enterprise
PDF
Easier Requirements Management Using Diagrams In Helix ALM
PDF
How To Master Your Mega Backlog
PDF
Achieving Software Safety, Security, and Reliability Part 3: What Does the Fu...
PDF
How to Scale With Helix Core and Microsoft Azure
PDF
Achieving Software Safety, Security, and Reliability Part 2
PDF
Should You Break Up With Your Monolith?
PDF
Achieving Software Safety, Security, and Reliability Part 1: Common Industry ...
PDF
What's New in Helix ALM 2019.4
PDF
Free Yourself From the MS Office Prison
How to Organize Game Developers With Different Planning Needs
Regulatory Traceability: How to Maintain Compliance, Quality, and Cost Effic...
Efficient Security Development and Testing Using Dynamic and Static Code Anal...
Understanding Compliant Workflow Enforcement SOPs
Branching Out: How To Automate Your Development Process
How to Do Code Reviews at Massive Scale For DevOps
How to Spark Joy In Your Product Backlog
Going Remote: Build Up Your Game Dev Team
Shift to Remote: How to Manage Your New Workflow
Hybrid Development Methodology in a Regulated World
Better, Faster, Easier: How to Make Git Really Work in the Enterprise
Easier Requirements Management Using Diagrams In Helix ALM
How To Master Your Mega Backlog
Achieving Software Safety, Security, and Reliability Part 3: What Does the Fu...
How to Scale With Helix Core and Microsoft Azure
Achieving Software Safety, Security, and Reliability Part 2
Should You Break Up With Your Monolith?
Achieving Software Safety, Security, and Reliability Part 1: Common Industry ...
What's New in Helix ALM 2019.4
Free Yourself From the MS Office Prison

Recently uploaded (20)

PPT
Module 1.ppt Iot fundamentals and Architecture
PDF
Two-dimensional Klein-Gordon and Sine-Gordon numerical solutions based on dee...
PDF
STKI Israel Market Study 2025 version august
PDF
OpenACC and Open Hackathons Monthly Highlights July 2025
PPT
What is a Computer? Input Devices /output devices
PDF
Credit Without Borders: AI and Financial Inclusion in Bangladesh
PDF
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
PDF
Hindi spoken digit analysis for native and non-native speakers
PDF
Flame analysis and combustion estimation using large language and vision assi...
PDF
How ambidextrous entrepreneurial leaders react to the artificial intelligence...
PPTX
2018-HIPAA-Renewal-Training for executives
PDF
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
PPT
Galois Field Theory of Risk: A Perspective, Protocol, and Mathematical Backgr...
PPTX
Chapter 5: Probability Theory and Statistics
PDF
The influence of sentiment analysis in enhancing early warning system model f...
PPTX
AI IN MARKETING- PRESENTED BY ANWAR KABIR 1st June 2025.pptx
PPTX
Microsoft Excel 365/2024 Beginner's training
PDF
A review of recent deep learning applications in wood surface defect identifi...
PDF
Five Habits of High-Impact Board Members
PDF
Consumable AI The What, Why & How for Small Teams.pdf
Module 1.ppt Iot fundamentals and Architecture
Two-dimensional Klein-Gordon and Sine-Gordon numerical solutions based on dee...
STKI Israel Market Study 2025 version august
OpenACC and Open Hackathons Monthly Highlights July 2025
What is a Computer? Input Devices /output devices
Credit Without Borders: AI and Financial Inclusion in Bangladesh
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
Hindi spoken digit analysis for native and non-native speakers
Flame analysis and combustion estimation using large language and vision assi...
How ambidextrous entrepreneurial leaders react to the artificial intelligence...
2018-HIPAA-Renewal-Training for executives
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
Galois Field Theory of Risk: A Perspective, Protocol, and Mathematical Backgr...
Chapter 5: Probability Theory and Statistics
The influence of sentiment analysis in enhancing early warning system model f...
AI IN MARKETING- PRESENTED BY ANWAR KABIR 1st June 2025.pptx
Microsoft Excel 365/2024 Beginner's training
A review of recent deep learning applications in wood surface defect identifi...
Five Habits of High-Impact Board Members
Consumable AI The What, Why & How for Small Teams.pdf

Five Real-World Strategies for Perforce Streams

  • 1. # Erik van Nooijen Technical Lead at TomTom
  • 2. # 10 years as contractor • (senior) developer 5 years in TomTom - Netherlands • 3 years senior developer • 2 years technical lead
  • 3. #
  • 4. # TomTom total Perforce installation size 780 Gb database 3.2 TB versioned files #proxies 10 #replicas 4 #users ~700 #workspaces ~19000 #changes ~1.000.000 Main server 32 core 284 Gb ram 4* Fusion IO (ssd) 8.6 Tb Streamed depot size 52 Gb #streams 360 #mainlines 1 #release streams 20 #users ~150 #changes ~80000
  • 5. #
  • 6. # • Parent / child stream relationship – predefined integration flows • Merge-down / copy-up – resolve-on-child paradigm • Stream specification vs branch mapping • Moving workspace • Naming conventions – Renaming a stream does not rename the underlying branch • Deleting streams
  • 7. #
  • 8. # • Integrate 1 (or few) specific changelists up, without doing a full copy-up • Examples: – Quick propagation of a bug fix – Selective moving finished work to prep stream
  • 9. #
  • 10. # • Integrations that are not following pre-defined flow • Using ‘p4 integrate //source/…@11,11 //dest/…’ • Example: integrate specific changelist into existing release. Most often happens for bug fixes.
  • 11. # • Integrations that are not following pre-defined flow • Using ‘p4 integrate //source/…@11,11 //dest/…’ • Example: integrate specific changelist across development streams, without going via main. Usually for inter-dependencies between developments. • Alternative; use stream specification with ‘import’ – Defined imports with ‘import @’ available with p4d 2014.1 – Writable imports become available with p4d 2014.2
  • 12. #
  • 13. # Stream: //depot/main Type: mainline Paths: share //… Stream: //depot/dev-X Type: development Parent: //depot/main Paths: share //… import versions.txt //depot/main/versions.txt Client: depot_dev_ws View: //depot/dev-X/… // depot_dev_ws/… !! No ‘Stream:’ but using branch mappings $ p4 edit versions.txt $ p4 submit –d “my own development identifiers in versions.txt” $ p4 copy //depot/dev-X/… //depot/main/… $ p4 submit -d “copy up from dev stream” !! No –S <stream> for copy argument, but branch mappings Result: versions.txt changed on main! Final solution: 1. RW permission group on main for this file 2. educating users on p4 copy
  • 14. #
  • 15. # • Most benefit on server side, less so for end-users • Can be confusing when used with branch mapping • When to use regular development stream vs task stream ? – Task streams can be converted to type development, but conversion back is not possible • We decided not to use them, instead we use development streams only
  • 16. # • Reduce the amount of data that gets pulled into a workspace • Compose product combinations with only imports – One mainline with all imports for ‘mainlines’ – Many virtual streams based on the mainline that overrule the imports with various ‘release’ imports – Easy and cheap to make many combinations
  • 17. # canary-main (type: mainline) import os/… //depot-os/main/… import engine/… //depot-engine/main/… import ui/… //depot-ui/main/… import engine/ui-tweaks/… //depot-ui/main/tweaks/… canary-ui-rel1 (type: virtual) share … import ui/… //depot-ui/rel-1/… import engine/ui-tweaks/… //depot-ui/rel-1/tweaks/… canary-ui-rel2 (type: virtual) share … import ui/… //depot-engine/rel-2/… import engine/ui-tweaks/… //depot-ui/rel-2/tweaks/…
  • 18. #
  • 19. # • ‘p4 integrate –f’ is evil ! – alternative is ‘p4 copy’ • Use ‘integ.engine = 3’ – engine 3 is default, but maybe you have engine 2 specifically configured • Import with stream specification not (yet) supported – ‘import //… -S //depot/stream’
  • 20. # • Educate your user base • Cherry picking integrations • Cross integrations • Stream specification versus branch mapping • Task and virtual streams
  • 21. # Erik van Nooijen eric.vannooijen@tomtom.com #idonttweet

Editor's Notes

  • #3: 10 years contractor on and off for TomTom, some other jobs in between
  • #5: To give some indication of the size of Perforce in TomTom Streamed depot ~2.5 years in existence (since May 2012)
  • #7: Parent/child stream relationship: explain the ‘levels of stability: from dev -> dev -> main -> release’ “resolve on child paradigm”: or “Copy-up is trivial” This is the true power of perforce streams! Put focus here. Stream specification vs branch mapping: p4 commands support the “–S <stream>” option, which maps the stream view, while the same commands also allow for direct branch mapping /… notation (p4 integrate, copy, merge, …) Moving workspace: Very useful, but not all users like it. We have seen on numerous occasions submits in the wrong stream because the user forget the workspace was moved before. Use or don’t use per user-preference. Naming convention: we have: One mainline only, called ‘main’ All release stream names start with ‘rel-’ All development stream names start with ‘dev-’ All streams are named ‘<parentname>-<extension>’ to show clearly the parent/child structure, which is very convenient most of the time. It gives issues when reparenting (and would call for renaming, but that confuses again because of the streamname/branchname differences) Exception is of course all dev streams below main (they don’t start with ‘main-’) Exception is development stream below release stream (starts with ‘dev-’ and not ‘rel-’) Renaming a stream will be confusing for users and is not advised, based on experience. Deleting streams as to keep the streams overview clean. Note that it does not remove them from the left-hand side of p4v (@perforce; can this become a nested list?) TODO: add “use p4 <command> –S <stream>” option for all p4 commands that support it (see also later ‘streams vs branch mapping’)
  • #8: Cherry-picking concept is following the parent/child relationship, but does not do the full sets of changelists. Instead it does one or selected few sets of changelists.
  • #9: Cherrypicking happens, for example, when a specific change (say bugfix) needs to be propagated, but a full copy-up (or merge-down) is not wishful yet (because the full work on some task has not been completed). As we have streams for each stream below the mainline we have this behavior often. We have such setup because the teams like ‘working in their own area and setup’. Therefore teams cherrypick from their real development stream into a prep(eration) stream and from there copy-up into the mainline. TODO explain other situations where this might occur Call out to Perforce for official support and a whitepaper on this behavior: “Hey Perforce representatives; maybe you can support this officially with a ‘p4 –S <stream>’ command and describe the desired workflow in a nice whitepaper ?”
  • #11: Because there is no flow enabled from main into the release stream (by design, but can be enabled) it is not possible to normally integrate a fix from the mainline environment into the release. You could enable the flow in the stream specification of the release stream, but you’d have to copy a full set of changes, which is still not what you’d want. Making the edits twice manually, one in development stream and one in the release stream, is not a wishful situation as it is/can be lot of duplicate work and it opens the door for typos and (minor) differences. Call out to Perforce representatives again for another official support and whitepaper.
  • #12: Typically the same situation as before; consider a situation where 1 team/workpackage is depending on another that is not ready to deliver fully into the parent/mainline it happens that there is a crossintegration done to get the preliminary work quickly from one development stream into the other. Another option here is to be creative with import statements in the stream specification of dev-Y, but that can be cumbersome to maintain and gives issues if dev-Y wants to edit the imported files. Note: writable imports will be available in p4d 2014.2
  • #14: Tell the story of our user who did this and wasn’t even aware he did wrong. “but I used p4 copy” was his actual first response when asked about how he managed to copy versions.txt into main. Another option here is to be creative with import statements in the stream specification of dev-Y, but that can be cumbersome to maintain and gives issues if dev-Y wants to edit the imported files. Side effect is every stream gets the update via import whenever it changes on main, this is undesirable Note: writable imports will be available in 2014.2 P4D Educate your users: Use “p4 <command> –S <stream>”
  • #16: Task streams can be converted into development stream, but cannot convert back
  • #18: You can also do this with real (release) streams, but using virtual streams makes it very clear there isn’t any special branch, there isn’t any data stored specifically for these canaries and cleanup is easier, just delete the stream specification, no trace is left behind.
  • #20: ‘p4 integrate –f’ resets your integration history and causes unexpected results further down the line. We used it as our ‘go to hammer to hit any nail’ and since have moved away, preferring ‘p4 copy’ commands instead. TODO: can we make the road go behind the template footer ?
  • #21: Educate your user base: It seems so obvious, but instilling the true reasons and power of streams in combination with the appropriate commands with prevent you from some common mistakes Cherry picking integrations: Sometimes it is needed. Think about it, be prepared for the questions. Done with regular integrations that is not ‘streamy’ but works good. Cross integrations: Similar to cherry picking integrations, where it also ignores the common direction of merge and copy flows. @Perforce; can you support this use cases better ? Stream specification versus branch mapping: Use streamy commands wherever and whenever possible. When you use branch mapping; make sure you thought about its consequences. Task and virtual streams: Task streams have limited use, hard to define when you should choose for task rather than regular development type. @Perforce; maybe you can comment on this ? Virtual streams can be useful indeed, especially to limit the size of your workspaces, but some other creative use exists.
  • #22: Please pay attention to the mismatch in my email address, but really, my name is spelled correctly (that’s how my mum writes it, and she’s always right, as usual for mums) and my email is also correct.