Shikhar Dhawan smashed a scintillating century for India, but Sri Lanka's spinners struck five times to leave the tourists on edge after the first day of the third Test on Saturday (12).
Malinda Pushpakumara took three wickets and Lakshan Sandakan two, leaving India on 329-6 at the close, with Wriddhiman Saha on 13 and Hardik Pandya on one.
Pushpakamara rattled the Indian top-order with his left-arm spin after a 188-run opening stand between Dhawan, who hit 119 in 123 balls, and Lokesh Rahul.
Left-arm wrist spinner Sandakan's wickets included the prized scalp of Indian skipper Virat Kohli for 42.
"The Sri Lankan bowlers bowled well and pulled the match a little bit on their side," Dhawan, who celebrated his sixth Test century, told reporters.
"We got a good start and still feel at the end of the day, 329 is a good score. Those (who) are batting now are capable of scoring big runs," said Dhawan, adding India are looking to get 400 and more.
The left-right opening batting team of Dhawan and Rahul, who made 85, took India through the first session against a hapless Sri Lankan bowling attack.
Sri Lanka captain Dinesh Chandimal then rotated his spinners in the second session and India lost three top batsmen in just 11 overs.
The 30-year-old Pushpakumara, who made his Test debut in the second Test in Colombo, removed the openers to bring the hosts back into the contest.
Rahul, who scored his seventh consecutive Test fifty, mistimed a drive to mid-on and Dhawan soon followed his partner to the pavilion.
Rahul joined Everton Weekes, Andy Flower, Shivnarine Chanderpaul, Kumar Sangakkara and Chris Rogers on the list of batsmen who have made seven consecutive 50-plus scores in Tests.
Kohli tried to stem the rot during a 84-ball innings, ended when he edged a Sandakan delivery to slip.
Kohli and India toiled in the last session. The innings run-rate plummeted from around five in the morning session to 2.76 after tea.
"It's not easy to score runs out there and even outfield is not that quick. When Sri Lanka come out to bat, we are going to make sure that we squeeze them hard," said Dhawan.
Pace spearhead Vishwa Fernando chipped in with the wicket of Ravichandran Ashwin, who was caught behind after a hard-working 31.
"The bowlers came and bowled pretty well. Especially the spinners. We let them to 320 (329) for the first day. I'm really, really happy with the spinners," Sri Lanka's fast bowling consultant Chaminda Vaas said.
"At the end, the way Vishwa bowled in the last two spells was also good.I think the way he's going he has a future and potential," added the former paceman.
India elected to bat first as they eye a series sweep after taking an unassailable 2-0 lead in Colombo.