A dominant India spared Sri Lanka the ignominy of a follow-on but Virat Kohli and Abhinav Mukund struck fluent half-centuries to tighten the touring side's grip on the first Test on Friday.
The world's top-ranked Test team shot out their depleted hosts for 291 to take a 309-run first innings lead and were 189-3 after third day's play at the Galle International Stadium.
Sri Lanka, already a batsman short after Asela Gunaratne fractured his thumb, received a new setback when Rangana Herath, leading the side in absence of ailing regular skipper Dinesh Chandimal, left the field with a hand injury.
India captain Kohli was unbeaten on 76 at stumps, after adding 133 runs with Mukund whose dismissal for 81 signalled the end of the day's play.
Earlier, Sri Lanka resumed on 154-5 and could have been in bigger trouble but for Dilruwan Perera's gutsy 92 not out.
Angelo Mathews held the key to Sri Lanka's survival and the former captain made 83 before Ravindra Jadeja (3-67) sent him back.
The spinner sent down a flighted delivery and Mathews moved towards leg and slapped it straight to Kohli at short cover. Mathews hit 11 boundaries and a six.
Perera enjoyed an eventful stay at the crease.
Two balls after an appeal for a catch off his boot was turned down, Perera was adjudged lbw to Jadeja. The decision was overturned after replays suggested the ball would have sailed over the stumps.
Perera hit Ravichandran Ashwin for a six and took a single off the next ball to bring up his fifth test fifty.
Jadeja dismissed Herath for nine and debutant Hardik Pandya castled Nuwan Pradeep for 10 to claim his first Test wicket.
Perera was eight runs away from his maiden Test century when he ran out of partners. His belligerent knock included 10 fours and four sixes.
Perera then returned to dismiss Shikhar Dhawan for 14 after India opted against enforcing the follow-on and Lahiru Kumara sent back Cheteshwar Pujara for 15.
Kohli and Mukund shared a century-plus partnership for the third wicket as India moved 498 runs ahead and in a commanding position to take a 1-0 lead in the three-Test series.
SCORES IN BRIEF
INDIA: First innings 600
SRI LANKA: First innings 291 (Tharanga 64, Mathews 83, Perera 92 not out; Shami 2-45, Jadeja 3-67)
INDIA: Second innings 189 for 3 (Mukund 81, Kohli 76 not out; Perera 1-42, Kumara 1-53, Gunathilaka 1-15)