summaryrefslogtreecommitdiffstats
path: root/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/cow/CowSessionManager.java
blob: 197341fe4a0dadc4b18cee6c255320832e00f0bf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package org.openslx.bwlp.sat.fileserv.cow;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.openslx.bwlp.sat.database.mappers.DbLecture.LaunchData;
import org.openslx.bwlp.sat.thrift.SessionManager;
import org.openslx.bwlp.thrift.iface.UserInfo;
import org.openslx.util.QuickTimer;
import org.openslx.util.QuickTimer.Task;

public class CowSessionManager {

	private static final ReadWriteLock SESSION_LOCK = new ReentrantReadWriteLock();

	private static final Map<String, CowSession> SESSIONS = new HashMap<>();

	static {
		QuickTimer.scheduleAtFixedDelay(new Task() {
			@Override
			public void fire() {
				Lock lock = SESSION_LOCK.writeLock();
				lock.lock();
				try {
					for (Iterator<CowSession> iterator = SESSIONS.values().iterator(); iterator.hasNext();) {
						CowSession s = iterator.next();
						if (s.timedout()) {
							s.abort();
							iterator.remove();
						}
					}
				} finally {
					lock.unlock();
				}
			}
		}, 3600_577, 3601_010);
	}

	public static CowSession get(String id) {
		Lock lock = SESSION_LOCK.readLock();
		lock.lock();
		try {
			return SESSIONS.get(id);
		} finally {
			lock.unlock();
		}
	}

	public static boolean add(String id, CowSession session) {
		Lock lock = SESSION_LOCK.writeLock();
		lock.lock();
		try {
			if (SESSIONS.containsKey(id))
				return false;
			SESSIONS.put(id, session);
			return true;
		} finally {
			lock.unlock();
		}
	}

	/**
	 * Create a new cow session for the given image. Returns an according session id.
	 * On error, an exception is thrown, this will never return null.
	 */
	public static String create(String cowid, LaunchData ld, String sessionType) throws RuntimeException {
		UserInfo user = SessionManager.get(cowid);
		if (user == null)
			throw new RuntimeException("Unknown user");
		//
		String sessionId = UUID.randomUUID().toString();
		CowSession session = new CowSession(ld.imagePath, ld.configuration, ld.imageBaseId, ld.vmName, ld.restricted, user, sessionType);
		if (session.getError() != null) {
			throw new RuntimeException(session.getError());
		}
		add(sessionId, session);
		return sessionId;
	}

}