1576 lines
99 KiB
HTML
1576 lines
99 KiB
HTML
<!DOCTYPE html>
|
||
|
||
|
||
|
||
|
||
<html lang="en">
|
||
<head>
|
||
<meta name="pageKey" content="d_lithograph_content">
|
||
<!----><!----><!----> <meta name="locale" content="en_US">
|
||
<!----> <meta id="config" data-app-id="lithograph" data-app-version="0.0.2138" data-call-tree-id="AAZbQnH6EqDFFO4Rs1HlSQ==" data-multiproduct-name="lithograph-publish-frontend" data-service-name="lithograph-publish-frontend" data-browser-id="ee8f9cfc-c213-4fd1-86db-7b58a04bfc2e" data-is-bot="false" data-page-instance="urn:li:page:d_lithograph_content;9os/7jhNTk2AIBGG90F7og==" data-disable-jsbeacon-pagekey-suffix="false" data-dna-member-lix-treatment="control" data-human-member-lix-treatment="control" data-dfp-member-lix-treatment="control" data-sync-apfc-headers-lix-treatment="control" data-sync-apfc-cb-lix-treatment="control" data-recaptcha-v3-integration-lix-value="control" data-network-interceptor-lix-value="control" data-is-epd-audit-event-enabled="false" data-is-feed-sponsored-tracking-kill-switch-enabled="false" data-sequence-auto-redirect-before-request-enabled="true">
|
||
|
||
<link rel="canonical" href="https://www.linkedin.com/blog/engineering/scalability/operating-system-upgrades-at-linkedin-s-scale">
|
||
<!----><!---->
|
||
<!---->
|
||
<!---->
|
||
<!---->
|
||
<!---->
|
||
<link rel="icon" href="https://static.licdn.com/aero-v1/sc/h/al2o9zrvru7aqj8e1x2rzsrca">
|
||
|
||
|
||
<script>
|
||
function getDfd() {let yFn,nFn;const p=new Promise(function(y, n){yFn=y;nFn=n;});p.resolve=yFn;p.reject=nFn;return p;}
|
||
window.lazyloader = getDfd();
|
||
window.tracking = getDfd();
|
||
window.impressionTracking = getDfd();
|
||
window.ingraphTracking = getDfd();
|
||
window.appDetection = getDfd();
|
||
window.pemTracking = getDfd();
|
||
window.appRedirectCompleted = getDfd();
|
||
</script>
|
||
|
||
<!---->
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
|
||
<title>Operating system upgrades at LinkedIn’s scale</title>
|
||
<!---->
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:title" content="Operating system upgrades at LinkedIn’s scale">
|
||
<!---->
|
||
<meta property="og:url" content="https://www.linkedin.com/blog/engineering/scalability/operating-system-upgrades-at-linkedin-s-scale">
|
||
<meta property="og:image" content="https://media.licdn.com/dms/image/v2/D4D08AQGmWWS4L9Znyg/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688840752?e=2147483647&v=beta&t=L04NKtBs0_FKGlBitvOFKJrLlEBeLEkW_4A0_HPkocc">
|
||
<meta name="twitter:title" content="Operating system upgrades at LinkedIn’s scale">
|
||
<meta name="twitter:site" content="@linkedin">
|
||
<!---->
|
||
<!---->
|
||
<meta name="robots" content="noarchive">
|
||
|
||
<meta name="linkedin:pageTag" content="/blog/engineering/scalability/operating-system-upgrades-at-linkedin-s-scale">
|
||
<meta name="litmsProfileName" content="lithograph">
|
||
|
||
|
||
|
||
<!----> <meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
<meta name="asset-url" id="artdeco/static/images/icons.svg" content="https://static.licdn.com/aero-v1/sc/h/6sz1e821vgereyxaakx87tt4z ">
|
||
<link rel="stylesheet" href="https://static.licdn.com/aero-v1/sc/h/lbz6744ddd0wsc02ey2a3dhx">
|
||
<!---->
|
||
|
||
<!----> </head>
|
||
<body dir="ltr">
|
||
<!---->
|
||
|
||
|
||
|
||
<a href="#lithograph-app" class="skip-link btn-md btn-primary absolute z-11 -top-[100vh] focus:top-0">
|
||
Skip to main content
|
||
</a>
|
||
|
||
<!---->
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="page-header__wrapper page-header__wrapper--margin" data-custom-nav-wrapper="true">
|
||
<div class="page-header__container">
|
||
<header id="page-header" class="page-header page-header--hide-dropshadow">
|
||
<div class="page-header__content-container">
|
||
<div class="header__logo">
|
||
<a href="https://www.linkedin.com/blog/engineering" class="custom-nav__logo-link">
|
||
<img class="header__linkedin-logo header__full-logo" src="https://static.licdn.com/aero-v1/sc/h/6zm111mce7vohqze950ilreo4" alt="LinkedIn Logo">
|
||
<img class="header__linkedin-logo header__in-bug" src="https://static.licdn.com/aero-v1/sc/h/5g0hjlcng3j5pgn50n2et1ca2" alt="LinkedIn Logo">
|
||
<span class="t-17 t-black t-bold default-header-title">
|
||
Engineering Blog
|
||
</span>
|
||
</a>
|
||
</div>
|
||
|
||
<!---->
|
||
<!---->
|
||
<button class="stripped header__expand-nav-button" data-mobile-header-navigation-button data-header-expand-navigation-button aria-expanded="false">
|
||
<li-icon class="header__expand-nav-icon" a11y-text="Open navigation" type="hamburger-icon"></li-icon>
|
||
</button>
|
||
<button class="stripped header__expand-nav-button hidden" data-mobile-header-navigation-button data-header-collapse-navigation-button aria-expanded="false">
|
||
<li-icon class="header__expand-nav-icon" a11y-text="Close navigation" type="cancel-icon"></li-icon>
|
||
</button>
|
||
</div>
|
||
</header>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<nav class="header-nav fixed" aria-label="main" data-header-navigation>
|
||
<ul class="header-nav__list">
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/data" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Data
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Data" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/graph-systems" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Graph System</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/economic-graph" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Economic Graph</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/skills-graph" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Skills Graph</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/knowledge" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Knowledge Graph</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/data-management" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Data Management</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/data-streaming-processing" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Data Streams/Processing</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/data-science" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Data Science</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/research" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Research</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/ab-testing-experimentation" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">A/B Testing/Experimentation</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/artificial-intelligence" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
AI
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for AI" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/machine-learning" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Machine Learning</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/natural-language-processing" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Natural Language Processing</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/generative-ai" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Generative AI</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/data-modeling" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Data Modeling</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/responsible-ai" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Responsible AI</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/trust-and-safety" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Trust & Safety
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Trust &amp; Safety" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/fairness" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Fairness</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/verification" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Verification </a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/security" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Security</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/product-design" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Product Design
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Product Design" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/marketing" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Marketing </a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/sales" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Sales</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/learning" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Learning</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/hiring" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Hiring</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/profile" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Profile</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/messaging-notifications" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Messaging/Notifications</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/feed" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Feed</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/profile" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Profile</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/groups" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Groups</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/accessibility" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Accessibility</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/member-customer-experience" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Member/Customer Experience</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/search" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Search</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/recommendations" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Recommendations</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/skills" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Skills</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/infrastructure" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Infrastructure
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Infrastructure" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/code" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Code</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/scalability" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Scalability</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/distributed-systems" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Distributed Systems</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/graph-systems" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Graph Systems</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/architecture" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Architecture</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/analytics" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Analytics</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/automation" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Automation</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/platform-platformization" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Platforms/Platformization</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/cloud-computing" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Cloud Computing</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/open-source" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Open Source</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/additional-innovations" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Additional Innovations</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/talent" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Talent
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Talent" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/culture" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Culture</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/developer-experience-productivity" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Developer Experience/Productivity</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/leadership" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Leadership</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
|
||
|
||
|
||
|
||
|
||
<nav class="custom-header__nav--mobile invisible" data-mobile-navigation="true" aria-label="main">
|
||
|
||
<ul class="custom-header__list--mobile">
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/data" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Data
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Data" aria-expanded="false" data-label-expand="Expand to show more links for Data" data-label-collapse="Collapse to show less links for Data" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/graph-systems" class="t-sans t-black t-normal header-nav__link" target="_self">Graph System</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/economic-graph" class="t-sans t-black t-normal header-nav__link" target="_self">Economic Graph</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/skills-graph" class="t-sans t-black t-normal header-nav__link" target="_self">Skills Graph</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/knowledge" class="t-sans t-black t-normal header-nav__link" target="_self">Knowledge Graph</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/data-management" class="t-sans t-black t-normal header-nav__link" target="_self">Data Management</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/data-streaming-processing" class="t-sans t-black t-normal header-nav__link" target="_self">Data Streams/Processing</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/data-science" class="t-sans t-black t-normal header-nav__link" target="_self">Data Science</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/research" class="t-sans t-black t-normal header-nav__link" target="_self">Research</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/ab-testing-experimentation" class="t-sans t-black t-normal header-nav__link" target="_self">A/B Testing/Experimentation</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/artificial-intelligence" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
AI
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for AI" aria-expanded="false" data-label-expand="Expand to show more links for AI" data-label-collapse="Collapse to show less links for AI" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/machine-learning" class="t-sans t-black t-normal header-nav__link" target="_self">Machine Learning</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/natural-language-processing" class="t-sans t-black t-normal header-nav__link" target="_self">Natural Language Processing</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/generative-ai" class="t-sans t-black t-normal header-nav__link" target="_self">Generative AI</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/data-modeling" class="t-sans t-black t-normal header-nav__link" target="_self">Data Modeling</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/responsible-ai" class="t-sans t-black t-normal header-nav__link" target="_self">Responsible AI</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/trust-and-safety" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Trust & Safety
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Trust &amp; Safety" aria-expanded="false" data-label-expand="Expand to show more links for Trust &amp; Safety" data-label-collapse="Collapse to show less links for Trust &amp; Safety" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/fairness" class="t-sans t-black t-normal header-nav__link" target="_self">Fairness</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/verification" class="t-sans t-black t-normal header-nav__link" target="_self">Verification </a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/security" class="t-sans t-black t-normal header-nav__link" target="_self">Security</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/product-design" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Product Design
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Product Design" aria-expanded="false" data-label-expand="Expand to show more links for Product Design" data-label-collapse="Collapse to show less links for Product Design" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/marketing" class="t-sans t-black t-normal header-nav__link" target="_self">Marketing </a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/sales" class="t-sans t-black t-normal header-nav__link" target="_self">Sales</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/learning" class="t-sans t-black t-normal header-nav__link" target="_self">Learning</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/hiring" class="t-sans t-black t-normal header-nav__link" target="_self">Hiring</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/profile" class="t-sans t-black t-normal header-nav__link" target="_self">Profile</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/messaging-notifications" class="t-sans t-black t-normal header-nav__link" target="_self">Messaging/Notifications</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/feed" class="t-sans t-black t-normal header-nav__link" target="_self">Feed</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/profile" class="t-sans t-black t-normal header-nav__link" target="_self">Profile</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/groups" class="t-sans t-black t-normal header-nav__link" target="_self">Groups</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/accessibility" class="t-sans t-black t-normal header-nav__link" target="_self">Accessibility</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/member-customer-experience" class="t-sans t-black t-normal header-nav__link" target="_self">Member/Customer Experience</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/search" class="t-sans t-black t-normal header-nav__link" target="_self">Search</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/recommendations" class="t-sans t-black t-normal header-nav__link" target="_self">Recommendations</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/skills" class="t-sans t-black t-normal header-nav__link" target="_self">Skills</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/infrastructure" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Infrastructure
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Infrastructure" aria-expanded="false" data-label-expand="Expand to show more links for Infrastructure" data-label-collapse="Collapse to show less links for Infrastructure" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/code" class="t-sans t-black t-normal header-nav__link" target="_self">Code</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/scalability" class="t-sans t-black t-normal header-nav__link" target="_self">Scalability</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/distributed-systems" class="t-sans t-black t-normal header-nav__link" target="_self">Distributed Systems</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/graph-systems" class="t-sans t-black t-normal header-nav__link" target="_self">Graph Systems</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/architecture" class="t-sans t-black t-normal header-nav__link" target="_self">Architecture</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/analytics" class="t-sans t-black t-normal header-nav__link" target="_self">Analytics</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/automation" class="t-sans t-black t-normal header-nav__link" target="_self">Automation</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/platform-platformization" class="t-sans t-black t-normal header-nav__link" target="_self">Platforms/Platformization</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/cloud-computing" class="t-sans t-black t-normal header-nav__link" target="_self">Cloud Computing</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/open-source" class="t-sans t-black t-normal header-nav__link" target="_self">Open Source</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/additional-innovations" class="t-sans t-black t-normal header-nav__link" target="_self">Additional Innovations</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/talent" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Talent
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Talent" aria-expanded="false" data-label-expand="Expand to show more links for Talent" data-label-collapse="Collapse to show less links for Talent" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/culture" class="t-sans t-black t-normal header-nav__link" target="_self">Culture</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/developer-experience-productivity" class="t-sans t-black t-normal header-nav__link" target="_self">Developer Experience/Productivity</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/leadership" class="t-sans t-black t-normal header-nav__link" target="_self">Leadership</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
<div class="custom-header__button-share-container--mobile">
|
||
<!---->
|
||
</div>
|
||
</nav>
|
||
|
||
</div>
|
||
|
||
|
||
<main role="main">
|
||
|
||
<div id="lithograph-app">
|
||
|
||
|
||
<section id="component-container" data-attach-collapse-behavior="true">
|
||
|
||
|
||
<div id class="component component-articleHeadline" data-component-type="articleHeadline">
|
||
|
||
|
||
|
||
|
||
<div class="article-headline-container">
|
||
<p class="article-headline__topic">
|
||
<a class="t-14" href="https://www.linkedin.com/blog/engineering/scalability">Scalability</a>
|
||
</p>
|
||
|
||
<h1 class="article-headline t-40" data-article-title="Operating system upgrades at LinkedIn’s scale">Operating system upgrades at LinkedIn’s scale</h1>
|
||
<div class="article-meta t-14 article-meta__hairline">
|
||
<div class="article-meta__byline-container">
|
||
<p class="t-14 t-black--light" data-published-date="2022-8-31">
|
||
August 31, 2022
|
||
</p>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="social-share">
|
||
<ul class="social-share__list share-list" title="Share via" data-share-list>
|
||
|
||
|
||
<li class="share-list__item share-item">
|
||
<a href="#" class="share-item__link medium-round-muted-tertiary-button" role="button" data-tracking-control-name="_linkedin_share" data-share-type="linkedin" aria-label="Share on LinkedIn, New window will open">
|
||
<li-icon class="share-item__icon" type="linkedin-icon"></li-icon>
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="share-list__item share-item">
|
||
<a href="#" class="share-item__link medium-round-muted-tertiary-button" role="button" data-tracking-control-name="_facebook_share" data-share-type="facebook" aria-label="Share on Facebook, New window will open">
|
||
<li-icon class="share-item__icon" type="facebook-icon"></li-icon>
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="share-list__item share-item">
|
||
<a href="#" class="share-item__link medium-round-muted-tertiary-button" role="button" data-tracking-control-name="_twitter_share" data-share-type="twitter" aria-label="Share on X, New window will open">
|
||
<svg class="share-item__icon share-item__icon--twitter" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" focusable="false" aria-hidden="true" role="none">
|
||
<path d="M13.9 10.47L21.35 2h-1.76l-6.46 7.35L7.96 2H2l7.81 11.12L2 22h1.76l6.83-7.77L16.04 22H22l-8.1-11.53zm-2.42 2.75l-.79-1.11L4.4 3.3h2.71l5.08 7.11.79 1.11 6.6 9.24h-2.71l-5.39-7.54z"></path>
|
||
</svg>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p><i>Co-authors: <a href="https://www.linkedin.com/in/hengyang-hu-4934ba57/" target="_blank" data-tracking-control-name="_anchor_link">Hengyang Hu</a>, <a href="https://www.linkedin.com/in/dineshdhakal/" target="_blank" data-tracking-control-name="_anchor_link">Dinesh Dhakal,</a> <a href="https://www.linkedin.com/in/kalyanasundaram-somasundaram-67337837/" target="_blank" data-tracking-control-name="_anchor_link">Kalyanasundaram Somasundaram</a></i></p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<h2>Introduction</h2>
|
||
<p>Completing recurring operating system (OS) upgrades on time and without impacting users can be challenging. For LinkedIn, completing these upgrades at a massive scale has its own complexities as we’re often facing multiple upgrades. To secure our platform and protect our members’ data, we needed a fast and reliable OS upgrade framework with little to no human intervention.</p>
|
||
<p>In this blog, we’ll introduce a newly developed system, Operating System Upgrade Automation (OSUA), which allows LinkedIn to scale OS upgrades. OSUA has been used for more than 200,000 upgrades on servers that host LinkedIn’s applications.</p>
|
||
<h2>Key features</h2>
|
||
<p>After learning the lessons from the past upgrades, here are four remarkable features that OSUA provides.</p>
|
||
<p>Zero impact</p>
|
||
<p>One of our <a href="https://www.google.com/url?q=https://careers.linkedin.com/culture-and-values&sa=D&source=editors&ust=1661194080479313&usg=AOvVaw0b-YvKLEcGykXhvuaFNYqb" target="_blank" data-tracking-control-name="_anchor_link">key values</a> at LinkedIn is putting our customers and members first. In engineering, this means site-up (linkedin.com can be accessed and served anytime from anywhere securely) is always our first priority. OSUA is designed with mechanisms to ensure that no user-facing impact is risked during OS upgrades on servers. Therefore, zero-impact always comes first before any other features in design decisions.</p>
|
||
<p>High throughput</p>
|
||
<p>LinkedIn has a growing footprint in its on-prem serving facilities that consists of hundreds of thousands of physical servers. To perform a timely upgrade, OSUA has a high upgrade throughput by leveraging parallelization and some applications’ ephemerality that does not sacrifice site-up or cause any performance regression in the middle of upgrades. During the most recent fleet level upgrades, OSUA was capable of upgrading more than 10x more hosts per day than the old mechanisms before. Currently, we are working towards the goal of upgrading 2x of what OSUA can do now.</p>
|
||
<p>Support heterogeneous environments</p>
|
||
<p>The LinkedIn serving environment consists of various natures that include, but are not limited to, stateless applications, stateful systems (explained in detail later in the post), infrastructure services, etc. They are hosted in multiple locations, managed by a variety of schedulers, ranging from <a href="https://www.google.com/url?q=https://engineering.linkedin.com/blog/2016/05/rain--better-resource-allocation-through-containerization&sa=D&source=editors&ust=1661194080481362&usg=AOvVaw3AZn5S_MVy0kBOx7knkURA" target="_blank" data-tracking-control-name="_anchor_link">Rain</a> and Kubernetes to Yarn, and most are deployed in a multi-tenant fashion. OSUA currently supports approximately 94% of the LinkedIn footprint that is made up by these systems and its coverage continues to increase.</p>
|
||
<p>Automation, autonomous, reduce toil</p>
|
||
<p>In the past years, LinkedIn has undergone a few company-wide server OS upgrades for purposes like tech refreshes or improving our platform’s security. Our previous processes for OS upgrades were highly human resource intensive, which added a significant amount of toils to the teams involved. To overcome this, OSUA is designed to be a hand-free, self-serve service where users only need to click a button (or submit a CLI command). Any failures caused by upgrades will be reported back quickly to the corresponding teams. To customize the upgrade processes for different teams, OSUA also allows users to set up and manage their own policy of upgrades.</p>
|
||
<h2>Technical approach</h2>
|
||
<p>At a high level, a server (as an example) needs to go through the following three steps sequentially for an OS upgrade:</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQHQQ52e4naPUw/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688840832?e=2147483647&v=beta&t=brAVgSNo2RZX4En6rur0yK1mzP8wmAjsJc_7hsbxgio" alt="General steps of hosts">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p><i>Figure 1: General steps of hosts undergoing an OS upgrade</i></p>
|
||
<ol>
|
||
<li>Drain: Gracefully stopping or evacuating the applications that are running on the host serving traffic, sometimes with extra steps of initiating data balancing for stateful systems.</li>
|
||
<li>Upgrade: A server can go through a full reimaging to upgrade images that have the main partition cleaned but the data partition retained or through a yum update way of reimaging that has both main and data partitions retained. At the end of an upgrade, all servers need to have machine health checks, depending on their hardware and system specs, performed and passed before serving any payloads after upgrade.</li>
|
||
<li>Recover: Applications will be redeployed onto the server if they were allocated to it and not moved elsewhere as part of the drain step, possibly with data rebalancing and handling for stateful systems. For servers that had ephemeral applications evacuated, they become ready for any resource allocation of new workloads.</li>
|
||
</ol>
|
||
<p>These three steps seem simple to be done quickly but are much more complex at scale. To upgrade the entire LinkedIn fleet and provide the features listed above, OSUA is built at the orchestration layer to manage and coordinate the upgrades with the following highlights.</p>
|
||
<p>Unified workflow</p>
|
||
<p>To support heterogeneous environments while maintaining common upgrade processes and experiences, after numerous internal researches, request gathering, and case studies, we’ve developed a single workflow that could be a one-fit-all solution with portability and flexibility for various applications and resource schedulers’ characteristics. Having one workflow, like OSUA, also helps to reduce onboarding and education efforts.</p>
|
||
<p>When a host/server/vm is the working unit in the upgrade process, the workflow can be shown as follows:</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQGmWWS4L9Znyg/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688840752?e=2147483647&v=beta&t=L04NKtBs0_FKGlBitvOFKJrLlEBeLEkW_4A0_HPkocc" alt="Unified workflow of steps">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p><i>Figure 2: Unified workflow of steps of hosts undergoing an OS upgrade with optional pre-/post-step</i></p>
|
||
<p>Here are some design decisions worthwhile to highlight:</p>
|
||
<ul>
|
||
<li>Customized handling for drain and recover phases provide applications with the ability to handle necessary tasks before and after upgrades in a customized way. These abilities are essential to preparing stateful systems for an upgrade and recover back to the pre-upgrade ready-to-serve condition.</li>
|
||
<li>Drain and recover phases are abstract. As they are tasks formatted as jobs encoded in <a href="https://www.google.com/url?q=https://linkedin.github.io/rest.li/&sa=D&source=editors&ust=1661194080485333&usg=AOvVaw3pcVSTJK3PEMTc2E41otcu" target="_blank" data-tracking-control-name="_anchor_link">rest.li</a> schema for multiple consumers (resource scheduler in this case) to work on, any consumer can be plugged in and execute the tasks of its kind in a different way according to their own needs.</li>
|
||
</ul>
|
||
<p>Impact analysis and batching</p>
|
||
<p>At LinkedIn, all OS upgrades are performed while live traffic is served. Therefore, during the drain phase, OSUA can only take down a computed subset of hosts that are submitted into its pipeline as a way of making use of capacity redundancy/reserve to ensure that linkedin.com has the needed capacity served.</p>
|
||
<p>OSUA leverages an internal standardized impact approval system (Blessin) that allows application teams to specify acceptable impact as a percentage of total number of instances / capacity as an absolute number, or consults customized built API, provided by individual service controllers (often cluster management services), to obtain information if a group of instances can be taken down and when.</p>
|
||
<p>While processing each host, OSUA figures out all of the application instances on the host and validates based on the configured rules in Blessin to determine if the application instances can be taken down. If all of the application instances on a host can be taken down, the host is picked for OS upgrade. The following figure illustrates a simplified example of determining if a host can be taken down for upgrades or if extra coordination, such as waiting, is needed.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQG2yPaOFeakug/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688841593?e=2147483647&v=beta&t=4PAspkXsaInsbBavu_QXcYLdW1gNF0AQ5f7yUQLNcqw" alt="Graphic of impact analysis process">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p><i>Figure 3: Example of impact analysis process</i></p>
|
||
<p>Some stateful teams have a condition where a group of hosts within a fault zone (a logical group where all-or-none hosts in it can perform maintenance all at once) should be upgraded together so the overall cluster’s rebalances can be kept minimal. In such a scenario, OSUA tries to drain, upgrade, and recover such hosts as a single batch if all of the hosts in the batches are approved.</p>
|
||
<p>To maximize throughput, the impact analysis and batching mechanism is streamlined and conducted by intervals with parallelization to timely refresh data (such as capacity and upgrade status) and continue to pick hosts for upgrades.</p>
|
||
<p>Cross-system operation coordination</p>
|
||
<p>OSUA won’t be the only system doing maintenance on the site. There will be constant deployments taking place on application instances initiated by other maintenance activities such as data defragmentation, repartition on stateful systems, network switch upgrades, etc. Such maintenance activities, along with routine code release actions, have to be coordinated well so that, on a host, only one activity can take place at a time. Otherwise, OSUA could pick a host to drain and at the same time a routine code release could take place, which affects the cluster health of application instances too and consequently the ultimate impact in total would exceed the allowance.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQH1p5IcMhq66A/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688841161?e=2147483647&v=beta&t=alpqfbp_3l7cZNiKvLNvomfIF-VQ3Hmso4vAYlqZ1Is" alt="Workflow of OSUA acquiring a lock from Insync">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p><i>Figure 4: Workflow of OSUA acquiring a lock from Insync while a system tries but fails to get the lock</i></p>
|
||
<p>To avoid this race condition, our SRE teams are working on a centralized locking system (Insync) where application instances and hosts can be locked for certain maintenance or release activities to ensure only one activity can take place at a time using a first in, first out (FIFO) method. A host that is locked successfully is considered down for maintenance in effective availability calculation during impact analysis. OSUA picks a host for maintenance only if the effective availability of each of the application instances is within the threshold configured by the owners of the application, and if the host is not locked already for any other maintenance activity. </p>
|
||
<p>Customized execution handling for stateful systems and more</p>
|
||
<p>While keeping the OS upgrade workflow unified that most applications can leverage, there are a number of systems that need customized handling in the format of pluggable add-on steps to the workflow because of their systematic complexities. One of the examples is the stateful system.</p>
|
||
<p>A stateful system is one where the operation of the system depends on a critical internal “state.” This state could be data or metadata that acts as the memory and history of the system at that point in time. The LinkedIn technical ecosystem comprises many stateful applications, especially on the data tier. These systems often have custom workflows that need to be executed before taking a node out of rotation (a.k.a. pre-steps) or bringing them back into the cluster (a.k.a. post-steps). These workflows vary quite a bit across the fleet and pose a bigger challenge for an automated OS upgrade setup.</p>
|
||
<p>In the past, engineers would need to run a number of administrative tasks manually or use scripts on to-be-upgraded hosts to ensure all necessary pre-steps are completed. Additionally, the problem is often compounded by the need to migrate data out of the to-be-upgraded host and rebalance the data across the rest of the cluster so that a minimum safe number of copies is maintained within the cluster. OSUA has to solve these diverse sets of problems while ensuring that no human toil is involved during the upgrade process.</p>
|
||
<p>To address the diverse demands from these systems, OSUA aligns towards a solution that is uniform in approach and still allows flexibility to these stateful systems to automate for their unique requirements for upgrades. As a result, OSUA leverages an in-house platform, STORU. STORU was initially developed with the idea of automating large scale operations for switch upgrades, but the system was extensible and supports customized automation before/after operations.</p>
|
||
<p>For pre-steps and post-steps, OSUA leverages a feature of STORU, custom hooks, which enables application owners to build custom application logic that would be executed before and after the OS upgrade process.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQF9cPEqrFkhaQ/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688841250?e=2147483647&v=beta&t=WWy4Hfms2mUN3ZrYYuUuiVutRv1VBa-Cw0vgQy5AbAI" alt="Graphic of custom hook execution of pre-step">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p><i>Figure 5: An example of custom hook execution of pre-step</i></p>
|
||
<p>In this section, we will focus on custom hooks and explore some of its salient features.</p>
|
||
<ul>
|
||
<li>Pre- and post-steps: As discussed earlier, a pre-step of the custom hook allows custom code execution to get hosts ready. This is usually required to safely take hosts out of rotation with optional customized extra steps. A post-step is a mirror image of the pre-step that is executed after the OS upgrade is complete to revert the outcomes of the pre-step.</li>
|
||
<li>Custom hook execution order: OSUA allows custom hooks to be executed in various stages, which are defined relative to the application deployment step during the upgrade process. Both pre- and post-steps can be executed before, after, or both before and after application (un)deployment. This provides flexibility for stateful applications to configure how custom code execution can be invoked.</li>
|
||
<li>Custom parameters: OSUA also allows application teams to define and pass additional parameters to custom hooks when submitting host(s) for upgrade. This helps custom code handle specific nuanced cases that might apply to a subset of hosts in the fleet when they are submitted for upgrade.</li>
|
||
</ul>
|
||
<h2>Auto-remediation</h2>
|
||
<p>At scale, there will always be a certain percentage of failure that can occur during any steps involved in the OS upgrade process ranging from unsuccess of application uninstallation and deployment to server breakdown. OSUA is equipped with mechanisms to detect, analyze, triage, and remediate failures automatically, which greatly reduces human toil and facilitates company-wide hardware repair and refresh.</p>
|
||
<h2>Self-contained</h2>
|
||
<p>OSUA by nature is an infrastructure service. To be self-contained and avoid circular dependencies, which can result in cascading outages, we build OSUA on top of a limited number of internal control plane services and don’t depend on large scale data plane systems if we are able to find alternative solutions. For example, for event messaging needs, instead of using LinkedIn’s ready-for-use <a href="https://www.google.com/url?q=https://engineering.linkedin.com/teams/data/data-infrastructure/streams/kafka&sa=D&source=editors&ust=1661194080492003&usg=AOvVaw3ZsfXH3OSSGqnFVw8ETbSk" target="_blank" data-tracking-control-name="_anchor_link">Kafka</a> clusters, we implemented a lightweight restful based pub-sub mechanism within OSUA. This is to avoid the circular dependency such as Kafka uses Kafka (as a OSUA dependency) to upgrade host OS of Kafka that can lead to cascading failure when an upgrade is unsuccessful.</p>
|
||
<h2>A recent LinkedIn OS upgrade</h2>
|
||
<p>Since introducing OSUA, it has successfully performed more than 200k upgrades at LinkedIn, with more than seven million system packages updated and 18 million vulnerabilities addressed on these servers, with no external impact to LinkedIn customers and members from outages rooted from systematic processes. Further, the engineering effort from engineering teams to spend on OS upgrades has been reduced by 90% from previous upgrades that had an even smaller scale. The daily peak upgrade velocity is a 10x improvement from previous upgrades.</p>
|
||
<p>Now, many LinkedIn engineering teams come to this single platform to delegate OS upgrade operations worry-free.</p>
|
||
<h2>Next steps</h2>
|
||
<p>OSUA has shown success recently on LinkedIn’s on-prem infrastructure upgrade. However, increasing upgrade velocity with lower failure rate and less human intervention will be our continuous focus.</p>
|
||
<h2>Acknowledgements</h2>
|
||
<p>OSUA could not have been accomplished without the help of many engineers, managers, and TPMs across many teams. The engineers who have made contributions to OSUA are: <a href="https://www.linkedin.com/in/anilalluri/" target="_blank" data-tracking-control-name="_anchor_link">Anil Alluri</a>, <a href="https://www.linkedin.com/in/amanharitsh123/" target="_blank" data-tracking-control-name="_anchor_link">Aman Sharma</a>, <a href="https://www.linkedin.com/in/anant-bir-singh/" target="_blank" data-tracking-control-name="_anchor_link">Anant Bir Singh</a>, <a href="https://www.linkedin.com/in/barak-zhou-94a0b1148/" target="_blank" data-tracking-control-name="_anchor_link">Barak Zhou</a>, <a href="https://www.linkedin.com/in/clintjoseph1992/" target="_blank" data-tracking-control-name="_anchor_link">Clint Joseph</a>, <a href="https://www.linkedin.com/in/hariprasadprabhakaran/" target="_blank" data-tracking-control-name="_anchor_link">Hari Prabhakaran</a>,<a href="https://www.linkedin.com/in/josettan919/" target="_blank" data-tracking-control-name="_anchor_link"> Jose Thomas Kiriyanthan</a>, <a href="https://www.linkedin.com/in/junyuanzeng/" target="_blank" data-tracking-control-name="_anchor_link">Junyuan Zeng</a>, <a href="https://www.linkedin.com/in/keithsward/" target="_blank" data-tracking-control-name="_anchor_link">Keith Ward</a>, <a href="https://www.linkedin.com/in/nikhita-k-65907618/" target="_blank" data-tracking-control-name="_anchor_link">Nikhita Kataria</a>, <a href="https://www.linkedin.com/in/parvathy-geetha/" target="_blank" data-tracking-control-name="_anchor_link">Parvathy Geetha</a>, <a href="https://www.linkedin.com/in/ronaknnathani/" target="_blank" data-tracking-control-name="_anchor_link">Ronak Nathani</a>, <a href="https://www.linkedin.com/in/ritupanjwani/" target="_blank" data-tracking-control-name="_anchor_link">Ritu Panjwani</a>, <a href="https://www.linkedin.com/in/subhas-sinha-3a84396/" target="_blank" data-tracking-control-name="_anchor_link">Subhas Sinha</a>, <a href="https://www.linkedin.com/in/ipsagar/" target="_blank" data-tracking-control-name="_anchor_link">Sagar Ippalpalli</a>, <a href="https://www.linkedin.com/in/timothy-mcnally/" target="_blank" data-tracking-control-name="_anchor_link">Tim McNally</a>, <a href="https://www.linkedin.com/in/vijaylbais/" target="_blank" data-tracking-control-name="_anchor_link">Vijay Bais</a>, <a href="https://www.linkedin.com/in/ying-he-1276b29b/" target="_blank" data-tracking-control-name="_anchor_link">Ying He</a>, <a href="https://www.linkedin.com/in/yashness/" target="_blank" data-tracking-control-name="_anchor_link">Yash Shah</a>, <a href="https://www.linkedin.com/in/john-sundharam/" target="_blank" data-tracking-control-name="_anchor_link">John Sushant Sundharam</a>, and <a href="https://www.linkedin.com/in/deepshikha-bitm/" target="_blank" data-tracking-control-name="_anchor_link">Deepshika</a>. Special thanks to our TPMs <a href="https://www.linkedin.com/in/seanpatrick56/" target="_blank" data-tracking-control-name="_anchor_link">Sean Patrick</a> and <a href="https://www.linkedin.com/in/soumyasnair/" target="_blank" data-tracking-control-name="_anchor_link">Soumya Nair</a> who have been steering this project from Day 1. Also, we’d like to thank the engineering leadership, <a href="https://www.linkedin.com/in/ashisareen/" target="_blank" data-tracking-control-name="_anchor_link">Ashi Sareen</a>, <a href="https://www.linkedin.com/in/mislam/" target="_blank" data-tracking-control-name="_anchor_link">Mir Islam</a>, <a href="https://www.linkedin.com/in/samirtata/" target="_blank" data-tracking-control-name="_anchor_link">Samir Tata</a>, <a href="https://www.linkedin.com/in/sankarhariharan/" target="_blank" data-tracking-control-name="_anchor_link">Sankar Hariharan</a>, and <a href="https://www.linkedin.com/in/senthilkumar-eswaran-758a961/" target="_blank" data-tracking-control-name="_anchor_link">Senthilkumar Eswaran</a>, who have been providing continuous support to building OSUA. Additionally, we would like to thank <a href="https://www.linkedin.com/in/adamdebus/" target="_blank" data-tracking-control-name="_anchor_link">Adam Debus</a>, <a href="https://www.linkedin.com/in/justinscottanderson/" target="_blank" data-tracking-control-name="_anchor_link">Justin Anderson</a>, and <a href="https://www.linkedin.com/in/jafferali/" target="_blank" data-tracking-control-name="_anchor_link">Samir Jafferal</a>i for their reviews and valuable feedback.</p>
|
||
<p> </p>
|
||
<h2> </h2>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-postList" data-component-type="postList">
|
||
|
||
|
||
|
||
|
||
<section id="postList0FocusPoint" class="component__content-container list-layout" data-post-list>
|
||
<section class="simple-topic-list">
|
||
<p class="t-14 t-bold">Topics:
|
||
<a class="simple-topic-list__topic" href="https://www.linkedin.com/blog/engineering/developer-experience-productivity">
|
||
Developer Experience/Productivity
|
||
</a>
|
||
</p>
|
||
</section>
|
||
|
||
<hr class="artdeco-divider">
|
||
|
||
<section class="list-layout__headline-container">
|
||
|
||
|
||
<p class="list-layout__headline t-32 t-sans">Related articles</p>
|
||
|
||
|
||
|
||
<!---->
|
||
</section>
|
||
|
||
<ul class="list-layout__posts">
|
||
|
||
|
||
<li class="post-list__item list-post">
|
||
<div class="list-post__content-container">
|
||
<!---->
|
||
<div class="list-post__content-container__title">
|
||
<a class="list-post__link t-20 t-black" href="https://www.linkedin.com/blog/engineering/trust-and-safety/managing-software-license-lifecycles-the-sllm-journey">
|
||
Managing software license lifecycles: the SLLM journey
|
||
</a>
|
||
</div>
|
||
|
||
<div class="list-post__content-container__byline">
|
||
<p class="list-post__content-container__author t-14 t-bold t-black">
|
||
Vinil Chandru
|
||
</p>
|
||
<!----><!----><!----><!---->
|
||
<p class="list-post__content-container__date t-14 t-black--light">
|
||
Apr 14, 2026
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="list-post__image-container">
|
||
<figure class="post__image-figure">
|
||
|
||
|
||
<img class="post__image" alt data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQEn4b5zXrvo2A/croft-frontend-shrinkToFit1200/B4DZ1zsp_XHMAg-/0/1775762580066?e=2147483647&v=beta&t=cy0-RNpwK2TR6o10cOKNsjMibDE9nHRXUseWNXG7sdA" data-ghost-url="https://static.licdn.com/aero-v1/sc/h/8pouyb1ly746xtru0x7p2axm0" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 480px">
|
||
|
||
</figure>
|
||
</div>
|
||
</li>
|
||
|
||
|
||
|
||
<li class="post-list__item list-post">
|
||
<div class="list-post__content-container">
|
||
<p class="list-post__content-container__topic">
|
||
<a class="t-14 t-bold" href="https://www.linkedin.com/blog/engineering/ai">
|
||
AI
|
||
</a>
|
||
</p>
|
||
|
||
<div class="list-post__content-container__title">
|
||
<a class="list-post__link t-20 t-black" href="https://www.linkedin.com/blog/engineering/ai/contextual-agent-playbooks-and-tools-how-linkedin-gave-ai-coding-agents-organizational-context">
|
||
Contextual agent playbooks and tools: How LinkedIn gave AI cod...
|
||
</a>
|
||
</div>
|
||
|
||
<div class="list-post__content-container__byline">
|
||
<p class="list-post__content-container__author t-14 t-bold t-black">
|
||
Ajay Prakash
|
||
</p>
|
||
<!---->
|
||
<p class="list-post__content-container__date t-14 t-black--light">
|
||
Jan 27, 2026
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="list-post__image-container">
|
||
<figure class="post__image-figure">
|
||
|
||
|
||
<img class="post__image" alt data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQEYEJheuYX8pA/croft-frontend-shrinkToFit480/B4DZv7AA_DG4AU-/0/1769442645450?e=2147483647&v=beta&t=a7xfm45P3iT2ibTjnnGQifNxyl_KMf1woeigTTdxw08" data-ghost-url="https://static.licdn.com/aero-v1/sc/h/8pouyb1ly746xtru0x7p2axm0" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 480px">
|
||
|
||
</figure>
|
||
</div>
|
||
</li>
|
||
|
||
|
||
|
||
<li class="post-list__item list-post">
|
||
<div class="list-post__content-container">
|
||
<p class="list-post__content-container__topic">
|
||
<a class="t-14 t-bold" href="https://www.linkedin.com/blog/engineering/infrastructure">
|
||
Infrastructure
|
||
</a>
|
||
</p>
|
||
|
||
<div class="list-post__content-container__title">
|
||
<a class="list-post__link t-20 t-black" href="https://www.linkedin.com/blog/engineering/infrastructure/-pursuit-of-universal-ownership-at-linkedin">
|
||
Pursuit of universal ownership at LinkedIn
|
||
</a>
|
||
</div>
|
||
|
||
<div class="list-post__content-container__byline">
|
||
<p class="list-post__content-container__author t-14 t-bold t-black">
|
||
Prince Shekhar Valluri
|
||
</p>
|
||
|
||
<p class="list-post__content-container__date t-14 t-black--light">
|
||
Jun 10, 2025
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="list-post__image-container">
|
||
<figure class="post__image-figure">
|
||
|
||
|
||
<img class="post__image" alt data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQFIYzP7gojvGA/croft-frontend-shrinkToFit1024/B4DZdWyTXBG8Ac-/0/1749507717703?e=2147483647&v=beta&t=hGbff9JP7OrfAlg57nPx-pCuja0cjvPrZvB2l5vCBEA" data-ghost-url="https://static.licdn.com/aero-v1/sc/h/8pouyb1ly746xtru0x7p2axm0" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 480px">
|
||
|
||
</figure>
|
||
</div>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<!----> </section>
|
||
|
||
|
||
</div>
|
||
|
||
|
||
<!----> </section>
|
||
</div>
|
||
|
||
<script src="https://static.licdn.com/aero-v1/sc/h/8hfbuq1ftcvnnx4dd5067pi0t" async></script>
|
||
<script src="https://static.licdn.com/aero-v1/sc/h/bknx7jzs0ylu540sn4wuo6bue" async></script>
|
||
<script src="https://static.licdn.com/aero-v1/sc/h/egqq1vs0784qd3h3801e2w9lr" async></script>
|
||
|
||
</main>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<footer class="li-footer bg-transparent w-full ">
|
||
<ul class="li-footer__list flex flex-wrap flex-row items-start justify-start w-full h-auto min-h-[50px] my-[0px] mx-auto py-3 px-2 papabear:p-0">
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
|
||
<span class="sr-only">LinkedIn</span>
|
||
<icon class="li-footer__copy-logo text-color-logo-brand-alt inline-block self-center h-[14px] w-[56px] mr-1" data-delayed-url="https://static.licdn.com/aero-v1/sc/h/5mebydpuuijm3uhv1q375inqh"></icon>
|
||
<span class="li-footer__copy-text flex items-center">© 2026</span>
|
||
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://about.linkedin.com?trk=content_footer-about" data-tracking-control-name="content_footer-about" data-tracking-will-navigate>
|
||
|
||
About
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/accessibility?trk=content_footer-accessibility" data-tracking-control-name="content_footer-accessibility" data-tracking-will-navigate>
|
||
|
||
Accessibility
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/legal/user-agreement?trk=content_footer-user-agreement" data-tracking-control-name="content_footer-user-agreement" data-tracking-will-navigate>
|
||
|
||
User Agreement
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/legal/privacy-policy?trk=content_footer-privacy-policy" data-tracking-control-name="content_footer-privacy-policy" data-tracking-will-navigate>
|
||
|
||
Privacy Policy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
<!---->
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/legal/cookie-policy?trk=content_footer-cookie-policy" data-tracking-control-name="content_footer-cookie-policy" data-tracking-will-navigate>
|
||
|
||
Cookie Policy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/legal/copyright-policy?trk=content_footer-copyright-policy" data-tracking-control-name="content_footer-copyright-policy" data-tracking-will-navigate>
|
||
|
||
Copyright Policy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://brand.linkedin.com/policies?trk=content_footer-brand-policy" data-tracking-control-name="content_footer-brand-policy" data-tracking-will-navigate>
|
||
|
||
Brand Policy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/psettings/guest-controls?trk=content_footer-guest-controls" data-tracking-control-name="content_footer-guest-controls" data-tracking-will-navigate>
|
||
|
||
Guest Controls
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/help/linkedin/answer/34593?trk=content_footer-community-guide" data-tracking-control-name="content_footer-community-guide" data-tracking-will-navigate>
|
||
|
||
Community Guidelines
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<!---->
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="collapsible-dropdown collapsible-dropdown--footer collapsible-dropdown--up flex items-center relative hyphens-auto language-selector z-2">
|
||
<!---->
|
||
<ul class="collapsible-dropdown__list hidden container-raised absolute w-auto overflow-y-auto flex-col items-stretch z-[9999] bottom-[100%] top-auto" role="menu" tabindex="-1">
|
||
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="العربية (Arabic)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ar_AE" data-locale="ar_AE" role="menuitem" lang="ar_AE">
|
||
العربية (Arabic)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="বাংলা (Bangla)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-bn_IN" data-locale="bn_IN" role="menuitem" lang="bn_IN">
|
||
বাংলা (Bangla)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Čeština (Czech)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-cs_CZ" data-locale="cs_CZ" role="menuitem" lang="cs_CZ">
|
||
Čeština (Czech)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Dansk (Danish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-da_DK" data-locale="da_DK" role="menuitem" lang="da_DK">
|
||
Dansk (Danish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Deutsch (German)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-de_DE" data-locale="de_DE" role="menuitem" lang="de_DE">
|
||
Deutsch (German)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Ελληνικά (Greek)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-el_GR" data-locale="el_GR" role="menuitem" lang="el_GR">
|
||
Ελληνικά (Greek)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="English (English) selected" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link--selected" data-tracking-control-name="language-selector-en_US" data-locale="en_US" role="menuitem" lang="en_US">
|
||
<strong>English (English)</strong>
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Español (Spanish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-es_ES" data-locale="es_ES" role="menuitem" lang="es_ES">
|
||
Español (Spanish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="فارسی (Persian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-fa_IR" data-locale="fa_IR" role="menuitem" lang="fa_IR">
|
||
فارسی (Persian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Suomi (Finnish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-fi_FI" data-locale="fi_FI" role="menuitem" lang="fi_FI">
|
||
Suomi (Finnish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Français (French)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-fr_FR" data-locale="fr_FR" role="menuitem" lang="fr_FR">
|
||
Français (French)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="हिंदी (Hindi)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-hi_IN" data-locale="hi_IN" role="menuitem" lang="hi_IN">
|
||
हिंदी (Hindi)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Magyar (Hungarian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-hu_HU" data-locale="hu_HU" role="menuitem" lang="hu_HU">
|
||
Magyar (Hungarian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Bahasa Indonesia (Indonesian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-in_ID" data-locale="in_ID" role="menuitem" lang="in_ID">
|
||
Bahasa Indonesia (Indonesian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Italiano (Italian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-it_IT" data-locale="it_IT" role="menuitem" lang="it_IT">
|
||
Italiano (Italian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="עברית (Hebrew)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-iw_IL" data-locale="iw_IL" role="menuitem" lang="iw_IL">
|
||
עברית (Hebrew)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="日本語 (Japanese)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ja_JP" data-locale="ja_JP" role="menuitem" lang="ja_JP">
|
||
日本語 (Japanese)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="한국어 (Korean)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ko_KR" data-locale="ko_KR" role="menuitem" lang="ko_KR">
|
||
한국어 (Korean)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="मराठी (Marathi)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-mr_IN" data-locale="mr_IN" role="menuitem" lang="mr_IN">
|
||
मराठी (Marathi)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Bahasa Malaysia (Malay)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ms_MY" data-locale="ms_MY" role="menuitem" lang="ms_MY">
|
||
Bahasa Malaysia (Malay)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Nederlands (Dutch)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-nl_NL" data-locale="nl_NL" role="menuitem" lang="nl_NL">
|
||
Nederlands (Dutch)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Norsk (Norwegian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-no_NO" data-locale="no_NO" role="menuitem" lang="no_NO">
|
||
Norsk (Norwegian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="ਪੰਜਾਬੀ (Punjabi)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-pa_IN" data-locale="pa_IN" role="menuitem" lang="pa_IN">
|
||
ਪੰਜਾਬੀ (Punjabi)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Polski (Polish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-pl_PL" data-locale="pl_PL" role="menuitem" lang="pl_PL">
|
||
Polski (Polish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Português (Portuguese)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-pt_BR" data-locale="pt_BR" role="menuitem" lang="pt_BR">
|
||
Português (Portuguese)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Română (Romanian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ro_RO" data-locale="ro_RO" role="menuitem" lang="ro_RO">
|
||
Română (Romanian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Русский (Russian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ru_RU" data-locale="ru_RU" role="menuitem" lang="ru_RU">
|
||
Русский (Russian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Svenska (Swedish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-sv_SE" data-locale="sv_SE" role="menuitem" lang="sv_SE">
|
||
Svenska (Swedish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="తెలుగు (Telugu)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-te_IN" data-locale="te_IN" role="menuitem" lang="te_IN">
|
||
తెలుగు (Telugu)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="ภาษาไทย (Thai)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-th_TH" data-locale="th_TH" role="menuitem" lang="th_TH">
|
||
ภาษาไทย (Thai)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Tagalog (Tagalog)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-tl_PH" data-locale="tl_PH" role="menuitem" lang="tl_PH">
|
||
Tagalog (Tagalog)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Türkçe (Turkish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-tr_TR" data-locale="tr_TR" role="menuitem" lang="tr_TR">
|
||
Türkçe (Turkish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Українська (Ukrainian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-uk_UA" data-locale="uk_UA" role="menuitem" lang="uk_UA">
|
||
Українська (Ukrainian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Tiếng Việt (Vietnamese)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-vi_VN" data-locale="vi_VN" role="menuitem" lang="vi_VN">
|
||
Tiếng Việt (Vietnamese)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="简体中文 (Chinese (Simplified))" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-zh_CN" data-locale="zh_CN" role="menuitem" lang="zh_CN">
|
||
简体中文 (Chinese (Simplified))
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="正體中文 (Chinese (Traditional))" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-zh_TW" data-locale="zh_TW" role="menuitem" lang="zh_TW">
|
||
正體中文 (Chinese (Traditional))
|
||
</button>
|
||
</li>
|
||
<!---->
|
||
</ul>
|
||
|
||
|
||
<button class="language-selector__button select-none relative pr-2 font-sans text-xs font-bold text-color-text-low-emphasis hover:text-color-link-hover hover:cursor-pointer focus:text-color-link-focus focus:outline-dotted focus:outline-1" aria-expanded="false" data-tracking-control-name="footer-lang-dropdown_trigger">
|
||
<span class="language-selector__label-text mr-0.5 break-words">
|
||
Language
|
||
</span>
|
||
<icon class="language-selector__label-chevron w-2 h-2 absolute top-0 right-0" data-delayed-url="https://static.licdn.com/aero-v1/sc/h/cyolgscd0imw2ldqppkrb84vo"></icon>
|
||
</button>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<!----> </footer>
|
||
|
||
|
||
|
||
<script src="https://static.licdn.com/aero-v1/sc/h/e69gtg8c61dzqklxridy0htl9" async></script>
|
||
<!---->
|
||
|
||
<!----><!---->
|
||
</body>
|
||
</html>
|
||
|
||
|
||
|