Sri Lanka were reeling at 154-5 at the end of day two after India posted 600 in their first innings in the opening Test at Galle on Thursday.
Angelo Mathews (54) and Dilruwan Perera (six) were not out at stumps, as the hosts still trailed by 446 runs with five wickets in hand.
India posted a commanding 600 in their first essay, thanks to centuries from Shikhar Dhawan (190) and Cheteshwar Pujara (153).
Umesh Yadav gave India an early breakthrough after the lower order helped the visitors post their fifth 600-plus total in the last few months.
Opener Dimuth Karunaratne was trapped leg before off Yadav in only the second over of their innings. Karunaratne went for a review but the TV umpire upheld the decision after replays showed the ball pitching on the middle stump.
Earlier, paceman Nuwan Pradeep clinched his maiden five-wicket haul to help bowl out top-ranked India for 600 shortly after lunch.
Pradeep (6-132) dismissed Cheteshwar Pujara for 153, triggering a batting collapse which saw the tourists lose four wickets in a lively first session after resuming at 399-3.
Pujara hit 13 fours in his 265-ball knock to match his previous Test best of 153 against South Africa at Johannesburg in 2013.
Hardik Pandya struck a half-century on debut as India’s last two wickets added a quickfire 83 runs in 71 balls to lift the side from 517 for 8.
Mohammed Shami hit Rangana Herath for three sixes while Pandya lofted Pradeep for as many sixes in an attacking batting display by India’s lower order batsmen.
Ajinkya Rahane (57) looked solid but was sent back to the pavilion after Karunaratne dived for a low catch on his right side off fast bowler Lahiru Kumara.
Ravichandran Ashwin and Wriddhiman Saha struck back with a sixth-wicket stand of 59, but India’s counter-attack unravelled as the hosts dismissed the duo in the space of six balls.
Ashwin (47) fell short of a well-deserved half-century while Saha (16) became the first victim of skipper Herath (1-159).