Reduced exclusive lock durations

This commit is contained in:
emeric
2023-11-19 16:17:27 +01:00
parent 575fec5727
commit 17a2a969e2
104 changed files with 881 additions and 705 deletions
+2 -2
View File
@@ -135,7 +135,7 @@ namespace API::Subsonic
void checkUserTypeIsAllowed(RequestContext& context, EnumSet<Database::UserType> allowedUserTypes)
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer currentUser{ User::find(context.dbSession, context.userId) };
if (!currentUser)
@@ -403,7 +403,7 @@ namespace API::Subsonic
if (request.continuation())
{
Database::Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() };
auto transaction{ session.createReadTransaction() };
const auto user{ Database::User::find(session, clientInfo.user) };
if (!user)
@@ -56,7 +56,7 @@ namespace API::Subsonic
Scrobbling::IScrobblingService& scrobblingService{ *Service<Scrobbling::IScrobblingService>::get() };
Feedback::IFeedbackService& feedbackService{ *Service<Feedback::IFeedbackService>::get() };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -156,7 +156,7 @@ namespace API::Subsonic
Response handleGetStarredRequestCommon(RequestContext& context, bool id3)
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -214,7 +214,7 @@ namespace API::Subsonic
if (size > defaultMaxCountSize)
throw ParameterValueTooHighGenericError{ "size", defaultMaxCountSize };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -247,7 +247,7 @@ namespace API::Subsonic
std::size_t offset{ getParameterAs<std::size_t>(context.parameters, "offset").value_or(0) };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
auto clusterType{ ClusterType::find(context.dbSession, "GENRE") };
if (!clusterType)
@@ -34,7 +34,7 @@ namespace API::Subsonic
Response handleGetBookmarks(RequestContext& context)
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -64,7 +64,7 @@ namespace API::Subsonic
unsigned long position{ getMandatoryParameterAs<unsigned long>(context.parameters, "position") };
const std::optional<std::string> comment{ getParameterAs<std::string>(context.parameters, "comment") };
auto transaction{ context.dbSession.createUniqueTransaction() };
auto transaction{ context.dbSession.createWriteTransaction() };
const User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -91,7 +91,7 @@ namespace API::Subsonic
// Mandatory params
TrackId trackId{ getMandatoryParameterAs<TrackId>(context.parameters, "id") };
auto transaction{ context.dbSession.createUniqueTransaction() };
auto transaction{ context.dbSession.createWriteTransaction() };
auto bookmark{ TrackBookmark::find(context.dbSession, context.userId, trackId) };
if (!bookmark)
+13 -13
View File
@@ -58,7 +58,7 @@ namespace API::Subsonic
Response::Node& artistInfoNode{ response.createNode(id3 ? Response::Node::Key{ "artistInfo2" } : Response::Node::Key{ "artistInfo" }) };
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
const Artist::pointer artist{ Artist::find(context.dbSession, id) };
if (!artist)
@@ -72,7 +72,7 @@ namespace API::Subsonic
auto similarArtistsId{ Service<Recommendation::IRecommendationService>::get()->getSimilarArtists(id, {TrackArtistLinkType::Artist, TrackArtistLinkType::ReleaseArtist}, count) };
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -99,7 +99,7 @@ namespace API::Subsonic
Artist::FindParameters parameters;
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -129,7 +129,7 @@ namespace API::Subsonic
bool hasMoreArtists{ true };
while (hasMoreArtists)
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
parameters.setRange(Range{ currentArtistOffset, batchSize });
const auto artists{ Artist::find(context.dbSession, parameters) };
@@ -159,7 +159,7 @@ namespace API::Subsonic
for (const ArtistId artistId : artistIds)
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
throw UserNotAuthorizedError{};
@@ -181,7 +181,7 @@ namespace API::Subsonic
const std::size_t meanTrackCountPerArtist{ (count / artistIds.size()) + 1 };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
std::vector<TrackId> tracks;
tracks.reserve(count);
@@ -212,7 +212,7 @@ namespace API::Subsonic
const std::size_t meanTrackCountPerRelease{ (count / releaseIds.size()) + 1 };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
std::vector<TrackId> tracks;
tracks.reserve(count);
@@ -258,7 +258,7 @@ namespace API::Subsonic
Random::shuffleContainer(tracks);
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -307,7 +307,7 @@ namespace API::Subsonic
Response response{ Response::createOkResponse(context.serverProtocolVersion) };
Response::Node& directoryNode{ response.createNode("directory") };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -366,7 +366,7 @@ namespace API::Subsonic
Response::Node& genresNode{ response.createNode("genres") };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
const ClusterType::pointer clusterType{ ClusterType::find(context.dbSession, "GENRE") };
if (clusterType)
@@ -390,7 +390,7 @@ namespace API::Subsonic
// Mandatory params
ArtistId id{ getMandatoryParameterAs<ArtistId>(context.parameters, "id") };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
const Artist::pointer artist{ Artist::find(context.dbSession, id) };
if (!artist)
@@ -417,7 +417,7 @@ namespace API::Subsonic
// Mandatory params
ReleaseId id{ getMandatoryParameterAs<ReleaseId>(context.parameters, "id") };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
Release::pointer release{ Release::find(context.dbSession, id) };
if (!release)
@@ -444,7 +444,7 @@ namespace API::Subsonic
// Mandatory params
TrackId id{ getMandatoryParameterAs<TrackId>(context.parameters, "id") };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
const Track::pointer track{ Track::find(context.dbSession, id) };
if (!track)
@@ -127,7 +127,7 @@ namespace API::Subsonic
StreamParameters parameters;
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
const User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -199,7 +199,7 @@ namespace API::Subsonic
std::filesystem::path trackPath;
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
auto track{ Track::find(context.dbSession, id) };
if (!track)
@@ -34,7 +34,7 @@ namespace API::Subsonic
Response handleGetPlaylistsRequest(RequestContext& context)
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
Response response{ Response::createOkResponse(context.serverProtocolVersion) };
Response::Node& playlistsNode{ response.createNode("playlists") };
@@ -58,7 +58,7 @@ namespace API::Subsonic
// Mandatory params
TrackListId trackListId{ getMandatoryParameterAs<TrackListId>(context.parameters, "id") };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -91,7 +91,7 @@ namespace API::Subsonic
if (!name && !id)
throw RequiredParameterMissingError{ "name or id" };
auto transaction{ context.dbSession.createUniqueTransaction() };
auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -140,7 +140,7 @@ namespace API::Subsonic
std::vector<TrackId> trackIdsToAdd{ getMultiParametersAs<TrackId>(context.parameters, "songIdToAdd") };
std::vector<std::size_t> trackPositionsToRemove{ getMultiParametersAs<std::size_t>(context.parameters, "songIndexToRemove") };
auto transaction{ context.dbSession.createUniqueTransaction() };
auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -189,7 +189,7 @@ namespace API::Subsonic
{
TrackListId id{ getMandatoryParameterAs<TrackListId>(context.parameters, "id") };
auto transaction{ context.dbSession.createUniqueTransaction() };
auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -67,7 +67,7 @@ namespace API::Subsonic
Response response{ Response::createOkResponse(context.serverProtocolVersion) };
Response::Node& searchResult2Node{ response.createNode(id3 ? "searchResult3" : "searchResult2") };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user)
@@ -28,7 +28,7 @@ namespace API::Subsonic
{
std::string username{ getMandatoryParameterAs<std::string>(context.parameters, "username") };
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
checkUserIsMySelfOrAdmin(context, username);
@@ -44,7 +44,7 @@ namespace API::Subsonic
Response handleGetUsersRequest(RequestContext& context)
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
Response response{ Response::createOkResponse(context.serverProtocolVersion) };
Response::Node& usersNode{ response.createNode("users") };
@@ -67,7 +67,7 @@ namespace API::Subsonic
Database::UserId userId;
{
auto transaction{ context.dbSession.createUniqueTransaction() };
auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, username) };
if (user)
@@ -79,7 +79,7 @@ namespace API::Subsonic
auto removeCreatedUser{ [&]()
{
auto transaction {context.dbSession.createUniqueTransaction()};
auto transaction {context.dbSession.createWriteTransaction()};
User::pointer user {User::find(context.dbSession, userId)};
if (user)
user.remove();
@@ -112,7 +112,7 @@ namespace API::Subsonic
{
std::string username{ getMandatoryParameterAs<std::string>(context.parameters, "username") };
auto transaction{ context.dbSession.createUniqueTransaction() };
auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, username) };
if (!user)
@@ -134,7 +134,7 @@ namespace API::Subsonic
UserId userId;
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, username) };
if (!user)
@@ -177,7 +177,7 @@ namespace API::Subsonic
{
Database::UserId userId;
{
auto transaction{ context.dbSession.createSharedTransaction() };
auto transaction{ context.dbSession.createReadTransaction() };
checkUserIsMySelfOrAdmin(context, username);